<?php
class ModelFactory {
	protected static $classes = array();
	
	/**
	 * 加载模型类
	 *
 	 * @param string $className 类名
     * @param mixed $args 初始参数
	 * @return object
	 */
	public static function getModelByName($name, $args = null, $prefix = null) {
		$className = $prefix . $name;
		return self::object($className, $args);
	}
	
	/**
	 * 获取数据库接口类
	 *
	 * @param mixed $args 初始参数
	 * @param string $className 类名
	 * @param string $basePath 搜索路径
	 * @return object
	 *
	 */
	public static function getDB($args = null, $className = 'DBHelperi_applepie') {
		return self::object($className, $args);
	}
	
	/**
	 * 获取分页类
	 * @param mixed $args 初始参数
	 * @param string $className 类名
	 * @param string $basePath 搜索路径
	 * @return object
	 *
	 */
	public static function getPager($args, $className = 'Pager') {
		return self::object($className, $args);
	}

	/**
	 * 加载并创建类
	 * @param string $className 类名
	 * @param mixed $args 初始参数
	 * @param string $basePath 搜索路径
	 * @return object
	 *
	 */
	protected static function object($className, $args = null, $basePath = INCLUDE_DIR) {
		// 从缓存中获取对象
		$key = strtolower($className);
		if (isset(self::$classes[$key])) {
			return self::$classes[$key];
		}

		// 加载类文件
		if (!class_exists($className)) {
			$filename = $basePath . str_replace('_', DIRECTORY_SEPARATOR, $className) . '.class.php';
			
			if (file_exists($filename)) {
				if (!include_once($filename)) {
					return false;		
				}
			}
		}
		
		// 创建对象
		$obj = null;
		if (is_array($args) || strlen($args)) {
			$obj = new $className($args);
		} else {
			$obj = new $className();
		}

		self::$classes[$key] = $obj;
		
		return $obj;
	}

}